/**
 * Data processing class, can be configured according to the project
 */
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
import type { RequestOptions, Result } from "@/types/axios";

export interface CreateAxiosOptions extends AxiosRequestConfig {
	authenticationScheme?: string;
	transform?: AxiosTransform;
	requestOptions?: RequestOptions;
}

export abstract class AxiosTransform {
	/**
	 * @description: 在发送请求之前调用的函数。它可以根据需要修改请求配置
	 */
	beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;

	/**
	 * @description: 处理响应数据
	 */
	transformResponseHook?: (res: AxiosResponse<Result>, options: RequestOptions) => any;

	/**
	 * @description: 请求失败处理
	 */
	requestCatchHook?: (e: Error, options: RequestOptions) => Promise<any>;

	/**
	 * @description: 请求之前的拦截器
	 */
	requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig;

	/**
	 * @description: 请求之后的拦截器
	 */
	responseInterceptors?: (res: AxiosResponse<any>) => AxiosResponse<any>;

	/**
	 * @description: 请求之前的拦截器错误处理
	 */
	requestInterceptorsCatch?: (error: Error) => void;

	/**
	 * @description: 请求之后的拦截器错误处理
	 */
	responseInterceptorsCatch?: (axiosInstance: AxiosInstance, error: Error) => void;
}
